package com.qf.conteoller;

import com.qf.utils.RedisUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/*
 *@Description:模拟秒杀
 *@author:刘哥
 *@Date:86180 2022/10/16 18:14
 */
@RestController
@RequestMapping("/seckill")
public class SeckillController {
    @Autowired
    private CuratorFramework curatorFramework;
    private RedisUtils redisUtils;
    //    库存量
    public static Map<String, Integer> itemStock = new HashMap<>();
    //    订单量
    public static Map<String, Integer> itemOrder = new HashMap<>();

    static {
        itemStock.put("牙刷", 10000);
        itemOrder.put("牙刷", 0);
    }

    /**
     * 模拟下单方法
     *
     * @return
     */
    @RequestMapping("/kill")
    public String kill(String item) throws Exception {
//       ============================= zookeeper加分布式锁=================
        InterProcessMutex mutex = new InterProcessMutex(curatorFramework, "/lock");
//       ============================= zookeeper加分布式锁=================
        if (mutex.acquire(1, TimeUnit.SECONDS)) {
//      减库存
            Integer stock = itemStock.get(item);
            if (stock <= 0) {
                return "牙刷卖完了";
            }
            itemStock.put("牙刷", stock - 1);
//        下订单
            Thread.sleep(10);
            itemOrder.put(item, itemOrder.get(item) + 1);
            //        =================zookeeper解锁=====================
            mutex.release();
//        =================zookeeper解锁=====================
//        返回数据
            return "抢购成功,库存为" + itemStock.get(item) + "订单量为" + itemOrder.get(item);
        }else {
            return "没有抢购到";
        }
    }
    @RequestMapping("/rediskill")
    public String redisKill(String item) throws Exception {
//       ============================= redis加分布式锁=================
//       ============================= redis加分布式锁=================
        if (redisUtils.lock(item,System.currentTimeMillis() + "", 1)){
//      减库存
            Integer stock = itemStock.get(item);
            if (stock <= 0) {
                return "牙刷卖完了";
            }
            itemStock.put("牙刷", stock - 1);
//        下订单
            Thread.sleep(10);
            itemOrder.put(item, itemOrder.get(item) + 1);
            //        =================redis加分布式锁=====================
            redisUtils.unlock(item);
//        =================redis加分布式锁=====================
//        返回数据
            return "抢购成功,库存为" + itemStock.get(item) + "订单量为" + itemOrder.get(item);
        }else {
            return "没有抢购到商品";
        }
    }

}
